// 引入net模块
const net = require('net')

// 创建一个空数组，用于存储所有连接的socket
const sockets = []

// 创建一个服务器
const server = net.createServer(() => {
  console.log('A new server has connected')
})

// 监听连接事件
server.on('connection', (socket) => {
  // 为每个连接的socket分配一个唯一的id
  const clientId = sockets.length + 1
  // 向客户端发送id
  socket.write(`id-${clientId}`)

  // 向所有已连接的客户端广播新用户加入的消息
  sockets.map((s) => {
    s.socket.write(`User ${clientId} joined!`)
  })

  // 监听客户端发送的数据
  socket.on('data', (data) => {
    // 将接收到的数据转换为字符串
    const dataString = data.toString('utf-8')
    // 获取发送者的id
    const id = dataString.substring(0, dataString.indexOf('-'))
    // 获取发送的消息内容
    const message = dataString.substring(dataString.indexOf('-message-') + 9)

    // Broadcast the received data to all connected clients
    // 如果sockets数组长度大于0
    if (sockets.length > 0) {
      // 遍历sockets数组
      sockets.forEach((s) => {
        // 如果当前socket不是要发送消息的socket
        if (s.socket !== socket) {
          // 向当前socket发送消息
          s.socket.write(`> User ${id}: ${message}`)
        }
      })
    }
  })

  // 当socket断开连接时
  socket.on('end', () => {
    // 遍历sockets数组
    sockets.map((s) => {
      // 如果当前socket不是要发送消息的socket
      if (s.socket !== socket) {
        // 向当前socket发送消息
        s.socket.write(`User ${clientId} left!`)
      }
    })
  })

  // 将当前socket添加到sockets数组中
  sockets.push({ id: clientId.toString(), socket })
})

// 监听3008端口
server.listen(3008, '127.0.0.1', () => {
  // 输出服务器正在监听3008端口
  console.log('Server is listening on port 3008', server.address())
})
